home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-06-02 | 3.7 KB | 218 lines | [TEXT/CWIE] |
- #ifndef __MEMUTILS__
- #include "MemUtils.h"
- #endif
- #ifndef __EXCEPTIONS__
- #include "Exceptions.h"
- #endif
-
-
- //------------------------------------------------------------------------------
- // Common constructor code
- //------------------------------------------------------------------------------
-
- #pragma segment Main
-
- void CAutoHandle::_CAutoHandle(Handle h, HandleState desiredState)
- {
- fHandle = nil; // in case of failure
-
- if (h != nil)
- {
- SignedByte state = HGetState(h);
- FailMemError();
-
- fHandle = h;
- fState = (HandleState) (((short) desiredState) & 0xff00 | ((short) state) & 0x00FF);
-
- if (!(state & kHLocked))
- { // It's not already locked
-
- if (!(kHPurge & desiredState & ~state))
- { // It's purgeable and we need to make it non-purgeable
-
- if ((state & kHResource) && (*h == nil))
- { // it's a purged resource
-
- LoadResource(h);
- FailResError();
- }
-
- HNoPurge(h);
- FailMemError();
- }
-
- if (desiredState & kHMoveHi)
- {
- MoveHHi(h);
- }
-
- if (desiredState & kHLocked)
- {
- HLock(h);
- }
-
- FailMemError();
- }
- }
- else
- {
- fState = desiredState;
- }
- }
-
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- CAutoHandle::CAutoHandle(
- Size size,
- HandleState desiredState)
- : fHandle(nil)
- {
- Handle h;
-
- if (desiredState & kHSysHeap)
- {
- h = (desiredState & kHClear) ? NewHandleSysClear(size) : NewHandleSys(size);
- }
- else if (desiredState & kHTempMem)
- {
- // h = (desiredState & kHClear) ? NewTempHandleClear(size) : NewHandleTemp(size);
-
- OSErr err;
-
- h = TempNewHandle(size, &err);
- FailNIL(h);
- FailOSErr(err);
-
- if (desiredState & kHClear && size > 0)
- {
- BlockZero(*h, size);
- }
-
- // WarnIf((desiredState & kHClear), "temp handles not cleared"); // REVIEW RMS
- }
- else
- {
- h = (desiredState & kHClear) ? NewHandleClear(size) : NewHandle(size);
- }
-
- FailMemError();
-
- _CAutoHandle(h, desiredState);
- }
-
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- CAutoHandle::CAutoHandle(
- const void* data,
- Size size,
- HandleState desiredState)
- : fHandle(nil)
- {
- Handle h;
-
- if (desiredState & kHSysHeap)
- {
- h = NewHandleSys(size);
- }
- else if (desiredState & kHTempMem)
- {
- OSErr err;
-
- h = TempNewHandle(size, &err); // RMS 980216
- FailNIL(h);
- FailOSErr(err);
- }
- else
- {
- h = NewHandle(size);
- }
-
- FailMemError();
-
- if (size > 0)
- {
- BlockMoveData(data, *h, size);
- }
-
- _CAutoHandle(h, desiredState);
- }
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- CAutoHandle::~CAutoHandle()
- {
- Handle h = fHandle; // for speed
-
- if (h != nil)
- {
- HandleState state = fState; // for speed
-
- if (state & kHDispose)
- {
- if (state & kHResource)
- {
- ReleaseResource(fHandle);
- LogIfErr(ResError());
- }
- else
- {
- DisposeHandle(fHandle);
- LogIfErr(MemError());
- }
- }
- else
- {
- HSetState(fHandle, (char) state);
- }
- }
- }
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- CTempHandle::~CTempHandle()
- {
- }
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- void CopyHandle(Handle src, Handle dst)
- {
- Size size = GetHandleSize(src);
- OSErr err = MemError();
-
- if (err == noErr)
- {
- ::SetHandleSize(dst, size);
- err = MemError();
- }
-
- if (err == noErr)
- {
- BlockMoveData(*src, *dst, size);
- }
- else
- {
- Throw(err);
- }
- }
-
- //------------------------------------------------------------------------------
- #pragma segment Main
-
- void BlockZero(void* ptr, Size size)
- {
- memset(ptr, 0, size);
- }
-
- //------------------------------------------------------------------------------
-
-
-
-